iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
AI & Data

從機器學習到深度學習 - 30天搞懂常見演算法的基礎理論系列 第 20

【Day 20】神經網路實作 Neural network implementation

  • 分享至 

  • xImage
  •  

今天將以深度學習常見的手寫阿拉伯數字辨識的資料集訓練,keras提供了兩種類型的模型,第一個是Sequential model,適用於簡單的結構,一層一層的連接下去。第二個為Functional API,它可以設計成複雜的神經網路,包含多個輸入以及輸出。

程式碼

Sequential model

首先,先寫一個function用來畫accuracy以及loss的圖。

import matplotlib.pyplot as plt
def plot(model, attr, width, height):
    plt.figure(figsize=(width, height))
    plt.plot(model.history[attr], color = 'r', label = attr)
    plt.plot(model.history['val_'+attr], color = 'b', label = 'val_'+attr)
    plt.xlabel('Epochs')
    plt.ylabel(attr)
    plt.legend()
    plt.show()

這個模型為使用Seuquential model,從keras的套件裡匯入資料集。

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

接著,將資料正規化,原始資料介於0-255之間,將它的範圍縮小至0-1之間,加速模型運算時間。

x_train, x_test = x_train/255.0, x_test/255.0

接著訓練模型,第一層使用Flatten,ru; 28乘28的資料攤平變成一維,轉乘784個特徵值。
Dense層為全連接層 (Fully connected),輸入為上一層的輸出,輸出為128個神經元。
Dropout的比例設為0.2,代表將20%的神經元之權重設為0,避免過度擬合的情況發生。
最後一層一樣為全連接層,神經元為10,因為手寫阿拉伯數字為0-9,總共有10個,而激活函數為softmax,在10個機率裡,最高的那個類別集為預測值。

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape = (28, 28)),
    tf.keras.layers.Dense(128, activation = 'relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation = 'softmax')
])

最後,設置模型的優化器以及loss function,以及評比的指標,並且輸入資料以及檢視準確率。

model.compile(optimizer = 'adam',
             loss = 'sparse_categorical_crossentropy',
             metrics = ['accuracy'])

history = model.fit(x_train, y_train, epochs = 5, validation_split = 0.2)

model.evaluate(x_test, y_test)

https://ithelp.ithome.com.tw/upload/images/20221003/2014568860lnguNuAD.png
最後一行輸出的第一個值為loss,第二個值為accuracy,這個模型的準確率高達97%。

f1 = plot(history, 'accuracy', 5, 3)
f2 = plot(history, 'loss', 5, 3)

https://ithelp.ithome.com.tw/upload/images/20221003/20145688mL4E6Qr6hr.png
這個模型只訓練了5次即能達到優異的預測效果,accuracy與loss最後測試集與驗證集的差距不大,沒有overfitting的問題。

Funtional API

Funtional API的程式碼前處理與sequential的一樣,不同的地方在於寫每一層的語法。

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train, x_test = x_train/255.0, x_test/255.0

Input = tf.keras.layers.Input(shape=(28,28))
layer1 = tf.keras.layers.Flatten()(Input)
layer2 = tf.keras.layers.Dense(128, activation = 'relu')(layer1)
layer3 = tf.keras.layers.Dropout(0.2)(layer2)
Output = tf.keras.layers.Dense(10, activation = 'softmax')(layer3)
model2 = tf.keras.Model(inputs = Input, outputs = Output)
model2.summary()
model2.compile(optimizer = 'adam',
             loss = 'sparse_categorical_crossentropy',
             metrics = ['accuracy'])

history2 = model2.fit(x_train, y_train, epochs = 5, validation_split = 0.2)

model2.evaluate(x_test, y_test)

https://ithelp.ithome.com.tw/upload/images/20221003/20145688XeMGDi22CV.png
使用Funtinal API的預測效果準確率也高達97%。

plot(history2, 'accuracy', 5, 3)
plot(history2, 'loss', 5, 3)

https://ithelp.ithome.com.tw/upload/images/20221003/20145688ycJglmPNdK.png
accuracy與loss跟上個模型一樣,在最後一個epoch的時候幾乎一樣。

程式碼已上傳我的Github
感謝您的瀏覽!
/images/emoticon/emoticon29.gif


上一篇
【Day 19】神經網路簡介與梯度下降法
下一篇
【Day 21】損失函數 Loss function
系列文
從機器學習到深度學習 - 30天搞懂常見演算法的基礎理論30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言